
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>Spring中都有哪些设计模式 - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>Spring中都有哪些设计模式 - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在Spring框架中，Bean的默认作用域是什么？这具体意味着什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Spring中，Bean的默认作用域是单例模式（Singleton）。这意味着当Spring容器初始化时，根据配置文件或注解创建的Bean实例，在整个Spring容器中只有一个实例存在，从而可以保证多个对象之间共享同一个Bean实例，节省系统资源。</div>
          </div>
          <div class="card-source">来源: 单例模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring容器是如何保证单例Bean在多线程环境下的线程安全的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">Spring容器通过在创建单例Bean时采取一些措施来确保其线程安全性，例如使用同步机制或线程安全的容器等，从而保证在多线程环境下，多个线程访问同一个单例Bean时不会发生线程安全问题。</div>
          </div>
          <div class="card-source">来源: 单例模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">工厂模式的核心思想是什么？Spring中的哪些核心接口体现了这一思想？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">工厂模式旨在提供一种封装对象创建逻辑的方式，隐藏具体对象的实例化过程，将对象的创建与使用相分离。在Spring中，BeanFactory和ApplicationContext接口可以被视为工厂接口，它们负责管理和创建bean对象，隐藏了bean的创建细节。</div>
          </div>
          <div class="card-source">来源: 工厂模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">理论</div>
          <div class="card-question">观察者模式中定义的两种核心角色是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">理论</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">观察者模式中存在两种核心角色：1. Subject（主题）：被观察的对象，它维护一系列观察者对象，并提供了添加、删除和通知观察者的方法。2. Observer（观察者）：依赖于主题的对象，它定义了一个更新接口，使得在主题状态发生变化时可以得到通知并执行相应操作。</div>
          </div>
          <div class="card-source">来源: 观察者模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring的事件监听机制（Application Event）是如何应用观察者模式的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Spring的事件监听机制中，开发者可以定义自己的事件并通过发布事件来通知所有监听该事件的观察者。在这种模式下，事件的发布者充当主题（Subject），而监听器则充当观察者（Observer），从而实现了一种松耦合的事件驱动模型。</div>
          </div>
          <div class="card-source">来源: 观察者模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">策略模式的根本目的是什么？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">策略模式是一种行为设计模式，它定义了一系列算法，并将每个算法封装到具有共同接口的独立类中，使得它们可以互相替换。其目的是实现算法的解耦和动态切换。</div>
          </div>
          <div class="card-source">来源: 策略模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">在Spring MVC框架中，`HandlerMapping`和`HandlerAdapter`是如何体现策略模式的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">在Spring MVC中，`HandlerMapping`负责将URL映射到具体的处理器(Controller)，而`HandlerAdapter`负责调用具体的处理器方法。通过配置不同的`HandlerMapping`和`HandlerAdapter`，可以根据请求的不同选择不同的处理策略，这正是策略模式的应用，实现了灵活的请求处理。</div>
          </div>
          <div class="card-source">来源: 策略模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">迭代器模式的核心作用是什么？它如何实现对象和遍历算法的解耦？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">迭代器模式的核心作用是提供一种方法来顺序访问一个聚合对象中的各个元素，而又不需要暴露该对象的内部表示。它将遍历的责任交给了迭代器对象，从而使得聚合对象和迭代算法能够相互独立地变化。</div>
          </div>
          <div class="card-source">来源: 迭代器模式</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">Spring容器在处理`BeanPostProcessor`接口时，是如何利用迭代器模式的？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">当Spring容器初始化一个Bean时，会调用所有已注册的`BeanPostProcessor`的`postProcessBeforeInitialization()`和`postProcessAfterInitialization()`方法。通过使用迭代器，Spring能够按照注册的顺序依次调用这些方法，从而实现对Bean的统一处理。</div>
          </div>
          <div class="card-source">来源: 迭代器模式</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
